home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
176-200
/
scopedisk185
/
calc
/
calcvalidate.mod
< prev
Wrap
Text File
|
1995-03-19
|
3KB
|
166 lines
IMPLEMENTATION MODULE CalcValidate;
(*$O- MUST turn off overflow checking! *)
(*$L+*)
FROM SYSTEM IMPORT LONGWORD, BYTE, ADR;
FROM CalcMenus IMPORT wordSize, signed, WSize;
CONST
ZeroDivide = "Divide by Zero!";
Overflow = "Overflow Error!";
PROCEDURE Addition(val1,val2:LONGWORD): BOOLEAN;
VAR
int1,int2,int3 : LONGINT;
card1,card2,card3 : LONGCARD;
BEGIN
errorString:=ADR(Overflow);
IF signed THEN
int1:=LONGINT(val1);
int2:=LONGINT(val2);
int3:=int1+int2;
IF ((int1>0) & (int2<0)) OR ((int1<0) & (int2>0)) THEN
RETURN TRUE;
END;
IF (int1>=0) & (int2>=0) THEN
IF MAX(LONGINT)-int1<int2 THEN
RETURN FALSE;
END;
RETURN NOT (((wordSize=WORD16) & (int3>32767)) OR
((wordSize=WORD8) & (int3>127)));
END;
IF MIN(LONGINT)-int1>int2 THEN
RETURN FALSE;
END;
RETURN NOT (((wordSize=WORD16) & (int3<-32768D)) OR
((wordSize=WORD8) & (int3<-128)));
END;
card1:=LONGCARD(val1);
card2:=LONGCARD(val2);
card3:=card1+card2;
IF MAX(LONGCARD)-card1<card2 THEN
RETURN FALSE;
END;
RETURN NOT (((wordSize=WORD16) & (card3>65535)) OR
((wordSize=WORD8) & (card3>255)));
END Addition;
PROCEDURE Subtraction(val1,val2:LONGWORD): BOOLEAN;
VAR
int1,int2,int3 : LONGINT;
BEGIN
errorString:=ADR(Overflow);
IF signed THEN
int1:=LONGINT(val1);
int2:=LONGINT(val2);
int3:=int1-int2;
IF ((int1>=0) & (int2>=0)) OR ((int1<=0) & (int2<=0)) THEN
RETURN TRUE;
END;
IF int2<0 THEN
IF MAX(LONGINT)+int2<int1 THEN
RETURN FALSE;
END;
RETURN NOT (((wordSize=WORD16) & (int3>32767)) OR
((wordSize=WORD8) & (int3>127)));
END;
RETURN TRUE;
END;
RETURN LONGCARD(val1)>=LONGCARD(val2);
END Subtraction;
PROCEDURE Multiplication(val1,val2:LONGWORD): BOOLEAN;
VAR
int1,int2,int3 : LONGINT;
card1,card2,card3 : LONGCARD;
negative : BOOLEAN;
BEGIN
errorString:=ADR(Overflow);
IF signed THEN
int1:=LONGINT(val1);
int2:=LONGINT(val2);
int3:=int1*int2;
IF ((int1>=-1) & (int1<=1)) OR ((int2>=-1) & (int2<=1)) THEN
RETURN TRUE;
END;
negative:=((int1>=0) & (int2<0)) OR ((int1<0) & (int2>=0));
IF negative THEN
IF ABS(MIN(LONGINT) DIV int1)<ABS(int2) THEN
RETURN FALSE;
END;
RETURN NOT (((wordSize=WORD16) & (int3<-32768D)) OR
((wordSize=WORD8) & (int3<-128)));
END;
IF MAX(LONGINT) DIV ABS(int1)<ABS(int2) THEN
RETURN FALSE;
END;
RETURN NOT (((wordSize=WORD16) & (int3>32767)) OR
((wordSize=WORD8) & (int3>127)));
END;
card1:=LONGCARD(val1);
card2:=LONGCARD(val2);
card3:=card1*card2;
IF (card1<=1) OR (card2<=1) THEN
RETURN TRUE;
END;
IF MAX(LONGCARD) DIV card1<card2 THEN
RETURN FALSE;
END;
RETURN NOT (((wordSize=WORD16) & (card3>65535)) OR
((wordSize=WORD8) & (card3>255)));
END Multiplication;
PROCEDURE Division(val1,val2:LONGWORD): BOOLEAN;
VAR
int1,int2 : LONGINT;
BEGIN
errorString:=ADR(Overflow);
IF signed THEN
int1:=LONGINT(val1);
int2:=LONGINT(val2);
IF (int2=-1) & ( (int1=MAX(LONGINT)) OR ((int1=32767) & (wordSize=WORD16))
OR ((wordSize=WORD8) & (int1=127))) THEN
RETURN FALSE;
END;
END;
errorString:=ADR(ZeroDivide);
RETURN (LONGCARD(val2) # 0);
END Division;
END CalcValidate.